import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import silhouette_score
import matplotlib.pyplot as plt
import chooseNumCluster


df = pd.read_excel("provice_info_2017.xlsx", index_col=0)        # 读入文件，索引为城市名
print(df)
df['十万人入学'] = df['高等教育（10w人）']+ df['高中阶段（10w人）'] + df['初中阶段（10w人）'] + df['小学（10w人）']     # 添加一列新列，综合统计每十万人入学比例
df['高等教育数'] = df['普通高校'] + df['成人高等学校'] + df['民办机构']    # 添加一列新列，综合统计高等机构数量
df.drop(['普通高校', '成人高等学校', '民办机构', '高等教育（10w人）', '高中阶段（10w人）', '初中阶段（10w人）', '小学（10w人）'], axis=1, inplace=True)     # 从dataframe中处理过的列
df.drop(['小学入学率'], axis=1, inplace=True)
print(df)
dataSet = df.values     # 将dataframe转化为矩阵
print(dataSet)
dataSet_train_minmax = MinMaxScaler().fit_transform(dataSet)        # 数据标准化处理，，将属性缩放到一个指定的最大和最小值（1-0）之间
# 数据标准化处理后的矩阵和省份序列组合成为新的dataframe，方便聚类后查看某个类别中有哪些省市
# df2 = pd.DataFrame(dataSet_train_minmax, index=df.index, columns=df.columns)
print(dataSet_train_minmax)
print(dataSet.shape)        # 输出维度

chooseNumCluster.scorePlot(dataSet_train_minmax)

num_clusters = 6      # 设置共有几个簇


model = KMeans(n_clusters=num_clusters, init='random')        # init 参数把初始的中心点设置为随机点
model.fit(dataSet_train_minmax)     # 调用 fit 方法来对数据集执行 k-means 算法。
labels = model.labels_      # 标注每个点的聚类结果
center = model.cluster_centers_     # center为各类的聚类中心
sh_score = silhouette_score(dataSet_train_minmax, labels)        # 计算簇里的所有点的轮廓系数。

plt.scatter(dataSet_train_minmax[:, 0], dataSet_train_minmax[:, 1], c='y')
plt.scatter(center[:, 0], center[:, 1], c='b')
plt.show()

# X = ["研究生招生数", "小学入学率", "占地面积", "图书", "固定资产值", "每十万入学率",'','']
X = df.columns.tolist()
style = ['-', '--', ':', '-.', ':', '--', 'solid']
for i in range(num_clusters):
    if i == num_clusters - 1:
        plt.plot(X, center[i], label='clustre'+str(i), linewidth=num_clusters, linestyle=style[num_clusters - 1], marker='*')
    else:
        plt.plot(X, center[i], label='clustre'+str(i), linewidth=2, linestyle=style[i], marker='o')
        plt.xlabel("各省不同属性")   # X轴
        plt.ylabel('values')     # Y轴
plt.rcParams['font.sans-serif'] = ['SimHei']      # 显示中文标签
plt.rcParams['axes.unicode_minus'] = False      # 不加这两行则图中中文乱码
plt.show()


"""
    输出不同类别的省份信息
"""
for i in range(num_clusters):
    res = df[(labels == i)]
    print(res)



